/*
  Promise:

    1. 概念
      用于解决异步回调地狱的方案

    2. 三种状态
      pending   初始化状态
      fulfilled 成功状态
      rejected  失败状态

    3. 状态如何发生变化
      当你new Promise构造函数产生promise实例对象时,需要传入一个函数, 其中函数又接受两个参数: resolve\reject
      调用resolve方法就能将promise实例对象的状态由pending改为fulfilled
      调用reject方法就能将promise实例对象的状态由pending改为rejected
      并且状态只能被改变一次

    4. promise实例上方法
      then 
        接受两个函数作为参数, 
          当 promise 对象变成 fulfilled 状态时会触发第一个回调函数,
          当 promise 对象变成 rejected 状态时会触发第二个回调函数,
        其中then方法本身也会返回一个新的promise对象, 这个promise对象的状态看:
          如果执行then方法传入的的回调时,报错了,就是失败状态
          如果执行then方法传入的的回调时, 内部返回了promise对象, 就看这个promise对象状态
          如果以上条件都没满足,就是成功状态
      catch
        接受一个函数作为参数, 只有当 promise 对象变成 rejected 状态时才会触发
        catch方法也返回一个promise对象, 这个promise对象的状态判断方式和then方法一致
      finally
         接受一个函数作为参数, 当promise对象状态变成 fulfilled 或 rejected 时触发
         finally方法也返回一个promise对象, 这个promise对象的状态判断方式和then方法一致

    5. promise构造函数上方法
      Promise.resolve() 返回一个成功状态 promise (也可能返回失败状态 promise)
      Promise.reject()  返回一个失败状态 promise
      Promise.all([promise1, promise2, ...]) 
        只有所有promise对象状态都是成功状态, 才是成功状态, 结果值就是所有promise对象的结果值
        只要有一个失败, 就失败
      Promise.allSettled([promise1, promise2, ...])
        只有当所有promise对象状态都发生变化, 就会返回一个成功状态promise, 结果值就是所有promise对象的结果值
          [
            { status: 'fulfilled', value: 111 },
            { status: 'rejected', reason: 222 },
          ]
      Promise.race([promise1, promise2, ...]) 
        当某个promise状态最先发生变化, 就返回这个promise
      Promise.any([promise1, promise2, ...])
        当某个promise状态第一个状态变成成功状态, 就返回这个promise
        所有promise失败,就返回失败状态

    6. 应用
      一般发送请求时返回值时promise,我们会结合async&await来得到结果值使用
      Promise.reject() 在封装请求函数时, 通过它返回失败promise
      Promise.allSettled() 某些页面需要同时发送多个请求获取数据时可以使用
*/

// const p = Promise.any([
//   Promise.reject(111),
//   Promise.reject(222),
//   Promise.reject(333),
// ]);

// p.then((res) => {
//   console.log("success", res);
// }).catch((err) => {
//   console.log("err", err);
// });

// const p = Promise.allSettled([
//   Promise.reject(111),
//   Promise.reject(222),
//   Promise.resolve(333),
// ]);

// p.then((res) => {
//   console.log("success", res);
// }).catch((err) => {
//   console.log("err", err);
// });

console.log(1);

const p = new Promise((resolve, reject) => {
  console.log(2);
  resolve();
});

p.then(() => {
  console.log(3);
  console.log(a); // a is not defined 报错
})
  .catch(() => {
    console.log(4);
  })
  .then(() => {
    console.log(5);
    return new Promise((reject) => reject());
  })
  .catch(() => {
    console.log(6);
    return new Promise((resolve) => resolve());
  })
  .then(() => {
    console.log(7);
    return new Promise(() => {});
  })
  .catch(() => {
    console.log(8);
  })
  .then(() => {
    console.log(9);
  })
  .catch(() => {
    console.log(10);
  });

console.log(11);
